package com.fsh.subject.domain.handler.subject;

import com.fsh.subject.common.enums.SubjectInfoTypeEnum;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 题目类型工厂
 *
 * 需要bean实现InitializingBean接口并且重写afterPropertiesSet()，
 * 且bean要注册到Spring容器中（所以加上 @Component），那么bean在实例化、属性注入后，重写的afterPropertiesSet()就会触发执行；
 *
 * @author: ChickenWing
 * @date: 2023/10/5
 */
@Component
public class SubjectTypeHandlerFactory implements InitializingBean {

    //注入所有的 SubjectTypeHandler 实现类从（单选，多选 ，判断，简答题的实现类）
    @Resource
    private  List<SubjectTypeHandler> subjectTypeHandlerList;

    //key 是 枚举 ，value是对应SubjectTypeHandler的实现类
    private static Map<SubjectInfoTypeEnum,SubjectTypeHandler> map=new HashMap<>();

    //通过这个subjectType（对应枚举的code）获取对应的 枚举，再通过这个枚举 从map里获取对应的 SubjectTypeHandler实现类。
    public SubjectTypeHandler getHandler(int subjectType){
        SubjectInfoTypeEnum subjectInfoTypeEnum = SubjectInfoTypeEnum.getByCode(subjectType);
        return map.get(subjectInfoTypeEnum);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        //将所有的 SubjectTypeHandler 实现类 放入map中。 key 是 枚举 ，value是对应SubjectTypeHandler的实现类
        for (SubjectTypeHandler subjectTypeHandler : subjectTypeHandlerList) {
            map.put(subjectTypeHandler.getHandlerType(),subjectTypeHandler);
        }
    }
}
